home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Command.C < prev    next >
C/C++ Source or Header  |  1992-04-27  |  2KB  |  144 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Command.h"
  6.  
  7. #include "Class.h"
  8. #include "Error.h"
  9. #include "String.h"
  10. #include "Port.h"
  11. #include "ObjectTable.h"
  12.  
  13. // can't undo, causes change, don't delete
  14. static Command ResetUndo("last command", eCmdTypeCantUndo);
  15.  
  16. // can't undo, no change, don't delete
  17. static Command NoChanges("no changes", eCmdTypeNoChange);
  18.  
  19. Command *gNoChanges= &NoChanges;
  20. Command *gResetUndo= &ResetUndo;
  21.  
  22. //---- Command -----------------------------------------------------------------
  23.  
  24. NewAbstractMetaImpl(Command,Object, (T(CmdNumber), TP(CmdName), TE(type),
  25.                 TE(state), TP(gNoChanges), TP(gResetUndo)));
  26.  
  27. Command::Command(int itsCmdNumber, char *itsCmdName, CommandType t)
  28. {
  29.     CmdNumber= itsCmdNumber;
  30.     CmdName= itsCmdName;
  31.     type= t;
  32.     state= eCmdStateNew;
  33. }
  34.  
  35. Command::Command(char *itsCmdName, CommandType t)
  36. {
  37.     CmdNumber= 9999;
  38.     CmdName= itsCmdName;
  39.     type= t;
  40.     state= eCmdStateNew;
  41. }
  42.  
  43. void Command::Commit()
  44. {
  45. }
  46.  
  47. void Command::DoIt()
  48. {
  49. }
  50.  
  51. void Command::RedoIt()
  52. {
  53.     DoIt();
  54. }
  55.  
  56. void Command::UndoIt()
  57. {
  58. }
  59.  
  60. void Command::Done(Command*)
  61. {
  62. }
  63.  
  64. void Command::Finish()
  65. {
  66.     if (this == gNoChanges || this == gResetUndo)
  67.     return;
  68.     if (state == eCmdStateDone)
  69.     Commit();
  70.     state= eCmdStateFinished;
  71.     delete this;
  72. }
  73.  
  74. int Command::Perform()
  75. {
  76.     if (this == gNoChanges || this == gResetUndo)
  77.     return 0;
  78.     int cc= 0;
  79.     
  80.     switch (state) {
  81.     case eCmdStateNew:
  82.     DoIt();
  83.     state= eCmdStateDone;
  84.     cc= 1;
  85.     break;
  86.     case eCmdStateDone:
  87.     UndoIt();
  88.     state= eCmdStateNotDone;
  89.     cc= -1;
  90.     break;
  91.     case eCmdStateNotDone:
  92.     RedoIt();
  93.     state= eCmdStateDone;
  94.     cc= 1;
  95.     break;
  96.     case eCmdStateFinished:
  97.     fprintf(stderr, "Command::Perform: oops!\n");
  98.     break;
  99.     }
  100.     if (type == eCmdTypeNoChange)
  101.     return 0;
  102.     return cc;
  103. }
  104.  
  105. char *Command::GetUndoName()
  106. {     
  107.     char *s1= "", *s, *cs= GetName();
  108.     
  109.     if (type == eCmdTypeCantUndo)
  110.     s1= "Can't ";
  111.  
  112.     if (state == eCmdStateDone)
  113.     s= "Undo";
  114.     else
  115.     s= "Redo";
  116.     
  117.     if (cs && *cs)
  118.     return form("%s%s %s", s1, s, cs);
  119.     return form("%s%s", s1, s);
  120. }
  121.  
  122. void Command::TrackConstrain(Point, Point, Point*)
  123. {
  124. }
  125.  
  126. void Command::TrackFeedback(Point, Point, bool)
  127. {
  128. }
  129.  
  130. Command *Command::TrackMouse(TrackPhase, Point, Point, Point)
  131. {
  132.     ResetFlag(eCmdMoveEvents);
  133.     return this;
  134. }
  135.  
  136. void Command::InspectorId(char *buf, int sz)
  137. {
  138.     if (GetName())
  139.     strn0cpy(buf, GetName(), sz);
  140.     else
  141.     Object::InspectorId(buf, sz);
  142. }
  143.  
  144.